package com.dalin.framework.dao;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import com.dalin.framework.common.pager.PageQuery;
/*****************************************************************************
 * @content: 框架级通用数据库访问接口                                                                                                   *
 * @author : 那建林                                                                                                                                 *
 * @crtDate: 2010-04-28                                                     *
 * @modDate: 2010-04-28                                                     *
 * @version: 1.3                                                            *
 ****************************************************************************/
public interface DbDao {
	/*************************************************************************
	 * @content: 向数据库表中添加记录
	 * @param  : 与数据库对应的po
	 * @author : 那建林                               
	 * @throws Exception 
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-04-28  
	 * @modDate: 2010-04-28
	 */
	void createObj(Object entity) throws Exception;
	

	/*************************************************************************
	 * @content: 更新数据库表中记录
	 * @param  : 要更新的实体对象
	 * @author : 那建林                               
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-04-28  
	 * @modDate: 2010-04-28
	 */
	void updateObj(Object entity);
	
	
	/*************************************************************************
	 * @content: 创建或更新数据库表中记录
	 * @param  : 要更新的实体对象
	 * @author : 那建林                               
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-04-28  
	 * @modDate: 2010-04-28
	 */
	void createOrUpdateObj(Object entity);
	
	
	/*************************************************************************
	 * @content: 向数据库表中批量添加或更新记录
	 * @param  : col 待插入对象集合
	 * @author : 那建林                               
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-04-28  
	 * @modDate: 2010-04-28
	 */
	void createOrUpdateObjs(Collection col);
	
	
	/*************************************************************************
	 * @content: 通过ID检索数据库表中记录
	 * @param  : 待检索的Class<?>对象
	 * @param  : ID主键
	 * @return : 检索到的实体bean
	 * @author : 那建林                               
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-04-28  
	 * @modDate: 2010-04-28 
	 */
	<N> N findObjById(Class<N> c, Long objId);
	<N> N findObjById(Class<N> c, String objId);
	
	
	/*************************************************************************
	 * @content: 删除数据库表中记录
	 * @param  : 要删除的实体对象
	 * @throws : java.lang.Exception
	 * @author : 那建林                               
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-04-28  
	 * @modDate: 2010-04-28
	 */
	void deleteObj(Object entity);
	
	
	/*************************************************************************
	 * @content: 根据ID数组删除数据库表中记录
	 * @param  : delIdArray 要删除的实体对象的id数组
	 * @param  : c 要删除的实体对象Class<?>
	 * @author : 那建林                               
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-04-28  
	 * @modDate: 2010-05-13
	 */
	void deleteObjs(Class<?> c, String[] delIdArray);
	void deleteObjs(Class<?> c, Long[] delIdArray);
	
	
	/*************************************************************************
	 * @content: 批量删除数据
	 * @param  : col 此对象的collection集合
	 * @author : 那建林                               
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-04-28  
	 * @modDate: 2010-04-28
	 */
	void deleteObjs(Collection col);
	
	
	/*************************************************************************
	 * @content: 删除此表全部数据
	 * @param  : c 与数据库对应的po Class<?>
	 * @author : 那建林                               
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-05-13 
	 * @modDate: 2010-05-13
	 */
	void deleteAllObjs(Class<?> c);
	
	
	/*************************************************************************
	 * @content: 根据hql语句查询相应数据库表中记录 
	 * @param  : hql语句
	 * @return : java.util.List集合
	 * @author : 那建林                               
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-04-28  
	 * @modDate: 2010-04-28
	 */
	 List queryObjs(final String hqlStr);
	 
	 
	/*************************************************************************
	 * @content: 根据相等件来查询记录集
	 * @param  : c 类信息
	 * @param  : param 查询条件
	 * @return : java.util.List集合
	 * @author : 那建林                               
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-05-13  
	 * @modDate: 2010-05-13
	 */
	List queryEqualObjs(Class<?> c, 
						final String paramName, 
						final Object paramValue);
	
	
	/*************************************************************************
	 * @content: 根据条件来模糊查询记录集
	 * @param  : c 类信息
	 * @param  : param 查询条件
	 * @return : java.util.List集合
	 * @author : 那建林                               
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-05-13  
	 * @modDate: 2010-05-13
	 */
	List queryLikeObjs(Class<?> c, 
						final String paramName, 
						final String paramValue);
	 
	 
	/*************************************************************************
	 * @content: 查询数据库相应表中所有记录,　如果无记录，则返回list.size为0
	 * @param  : 与数据库对应的po Class<?>
	 * @return : java.util.List集合
	 * @author : 那建林                               
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-04-28  
	 * @modDate: 2010-04-28
	 */
	List queryAllObjs(Class<?> c);
	
	
	/*************************************************************************
	 * @content: 根据查询条件进行分页查询
	 * @param  : 封装好的查询条件
	 * @return : java.util.List集合
	 * @author : 那建林 
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-04-28
	 * @modDate: 2010-04-28
	 */
	List queryObjsToPages(final PageQuery pageQuery);
	
	
	/*************************************************************************
	 * @content: 根据查询条件得到记录总数
	 * @param  : 封装好的查询条件
	 * @return : int
	 * @author : 那建林                               
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-04-28  
	 * @modDate: 2010-04-28
	 */
	int getTotalRowsNum(final PageQuery pageQuery);
	
	
	/************************************************************************
	  * @content: 根据sql(not hql)语句查询相应数据库表中记录,一条记录一个Map<i,值> 
	  * @param  : sql语句
	  * @return : java.util.List<Map>集合
	  * @author : 那建林                               
	 * @throws Exception 
	  * @email  : dalinjava@163.com
	  * @crtDate: 2010-04-28  
	  * @modDate: 2010-04-28
	  */
	List<Map> queryMapDataBySql(String sql) throws Exception;
	
	
	/*************************************************************************
	 * @content: 批量执行更新数据库语句，返回影响的行数
	 * @param  : hql语句
	 * @return : int
	 * @author : 那建林                               
	 * @email  : dalinjava@163.com
	 * @crtDate: 2010-04-28  
	 * @modDate: 2010-04-28
	 */
	int bulkUpdate(String hql);
}
